//
//  HMEmoticonView.swift
//  HMWeiBo
//
//  Created by Apple on 16/8/7.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit

private let HMEmoticonViewReuseIdentifier = "HMEmoticonViewReuseIdentifier"

class HMEmoticonView: UIView {
    // 第一步: 重写父类的构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
        
        setupCollectionView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 第二步: 定义一个添加子类和设置子类控件约束的方法
    private func setupUI(){
        
        addSubview(collectionView)
        
        addSubview(footerView)

        
        collectionView.snp_makeConstraints { (make) -> Void in
            make.left.equalTo(self.snp_left)
            make.top.equalTo(self.snp_top)
            make.right.equalTo(self.snp_right)
            make.bottom.equalTo(footerView.snp_top)
        }
        
        footerView.snp_makeConstraints { (make) -> Void in
            make.left.equalTo(self.snp_left)
            make.right.equalTo(self.snp_right)
            make.bottom.equalTo(self.snp_bottom)
            make.height.equalTo(44)
            
        }
   
        // 我们可以让他晚一点滚动
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
            // 我们让表情滚到 默认的表情
            self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem: 0, inSection: 1), atScrollPosition: UICollectionViewScrollPosition.Left, animated: false)
            
        }
       
    }
    
    private func setupCollectionView(){
        
        collectionView.dataSource = self
        
        // 分页
        collectionView.pagingEnabled = true
        collectionView.showsHorizontalScrollIndicator = false
        collectionView.showsVerticalScrollIndicator = false
        
        // 注册cell
        collectionView.registerClass(HMEmoticonViewCell.self, forCellWithReuseIdentifier: HMEmoticonViewReuseIdentifier)
        
        
        // 设置属性 -- 由于collectionView没有size,所以不能在这里实现设置大小
//        flowLayout.itemSize = collectionView.frame.size
        
        flowLayout.scrollDirection = .Horizontal
        
        flowLayout.minimumInteritemSpacing = 0
        flowLayout.minimumLineSpacing = 0
        
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        flowLayout.itemSize = collectionView.frame.size
    }
    
    //第三步: 懒加载控件
    //MARK:-- 懒加载控件
   
    var flowLayout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    
    private lazy var collectionView: UICollectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: self.flowLayout)
    
    // 自定义一个View
   
    private lazy var footerView: HMEmoticonFooterView = {
    
        let footerView = HMEmoticonFooterView(frame: CGRectZero)
        
        footerView.delegate = self
        
        return footerView
        
    }()
}

extension HMEmoticonView: UICollectionViewDataSource,HMEmoticonFooterViewDelegate{
    
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {

        return HMEmoticonManager.getAllEmoticons().count
    }
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
       
        return HMEmoticonManager.getAllEmoticons()[section].count
        
        
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(HMEmoticonViewReuseIdentifier, forIndexPath: indexPath) as! HMEmoticonViewCell
        
//        cell.label.text = " 第\(indexPath.section)部分 第\(indexPath.item)个Cell"
        //        cell.backgroundColor = RandomColor()
        
        // HMEmoticonManager.getAllEmoticons() -- 4个表情包
        // HMEmoticonManager.getAllEmoticons()[indexPath.section] -- 一个表情包
        // HMEmoticonManager.getAllEmoticons()[indexPath.section][indexPath.item] -- 对应着20个表情,所切割的一页
        cell.emoticons = HMEmoticonManager.getAllEmoticons()[indexPath.section][indexPath.item]
        
        return  cell
        
    }
    
    func footerButtonClick(type: HMEmoticonType) {
        
        let indexPath: NSIndexPath
        
        switch type {
            
        case .Recent:
            
            indexPath = NSIndexPath(forItem: 0, inSection: 0)
            
        case .Defalut:
             indexPath = NSIndexPath(forItem: 0, inSection: 1)
        case .Emoji:
             indexPath = NSIndexPath(forItem: 0, inSection: 2)
        case .Lxh:
            
             indexPath = NSIndexPath(forItem: 0, inSection: 3)
            
        }
        
         collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.Left, animated: false)
        
    }
    
}

class HMEmoticonViewCell: UICollectionViewCell {
    /*
    1. 数据已经展示了.对比效果,我们需要做什么? -> 添加 20 + 1个button
    2. 把分页的数据传递给Cell
    3. 有多少个表情,就展示多个按钮 -> 我们需要对数据源数组进行遍历.然后按照索引的顺序给 对应的按钮赋值
    4. 图片表情的路径如何获取??? -> 哪里有涉及到 图片路径就去哪里找线索
    5. Cell存在重用!!! if () {} else {} 把if和else的条件都要补齐
    6. 最近表情Cll重用的问题 -> 显示的bug是什么,我们就针对于这个bug怎么解决,至于产生是问题,我们再继续解决
    
    */
    
    // 20个表情是放在一个数组里
    // 有多少个表情,应该对应多少个button,所以我们对 var emoticons: [HMEmoticon] 进行遍历,对数据源进行遍历
    var emoticons: [HMEmoticon]? {
    
        didSet{
            
            // 在这里给20个表情赋值
            //subviews
//            emoticonsArray
            
            // 针对于现象提出改善的方案,再用另外一个方法解决这个问题
            for button in emoticonsArray {
             
                button.hidden = true
                
            }
            
            for (index,emoticon) in emoticons!.enumerate() {
                // 我们需要用下标取对应的按钮
                let button = emoticonsArray[index]
                
                // 在这里赋值
                button.emoticon = emoticon
                
                button.hidden = false
                
            }
            
        }
        
    }
    
    // 创建一个数组来保存这20个button
    private lazy var emoticonsArray: [HMEmoticonButton] = [HMEmoticonButton]()
    
    // 第一步: 重写父类的构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 第二步: 定义一个添加子类和设置子类控件约束的方法
    private func setupUI(){
        
        backgroundColor = RandomColor()
        

        addChildButtons()
        
    }
    //MARK:-- Cell是存在重用的
    
    //MARK:-- 添加21个button
    private func addChildButtons(){
        
        
        let childW: CGFloat = bounds.width / 7
        let childH: CGFloat = bounds.height / 3
        
        // 由于删除按钮比较特殊,它不算做我们的表情,所以循环的时候是20个
        for i in 0..<20 {
            
            let button = HMEmoticonButton(type: UIButtonType.Custom)
            
            // 设置属性
//            button.setTitle("\(i)", forState: UIControlState.Normal)
            
            button.addTarget(self, action: "emoticonButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
            
            button.titleLabel?.font = UIFont.systemFontOfSize(32)
            
            // 设置frame
            // x, y,with,height
            
            // 获取行和列
            let col = i % 7 // 列
            let row = i / 7 // 行
            
            let x = childW * CGFloat(col)
            let y = childH * CGFloat(row)
            
            button.frame = CGRectMake(x, y, childW, childH)
            
            // 添加到cell里
            contentView.addSubview(button)
            
            // 把按钮添加到数组里
            emoticonsArray.append(button)
        }
        
        
        // 单独添加删除按钮
        
        deleteButton.frame = CGRectMake(childW * 6, childH * 2, childW, childH)
        
        contentView.addSubview(deleteButton)
        
    }
    
    
    //MARK:-- 按钮的点击方法
    
    @objc private func emoticonButtonClick(button: HMEmoticonButton){
       
        // UIButton  HMEmoticon
        //  创建一个子类, 让一个子类拥有一个对象的实例
        
       // button.tag  找到他的索引 -> 
        
        // 先拿到表情  1. 通过下标 2.
        if let emo = button.emoticon {
            
            // 再把表情添加到最近数组
            
            // 不建议这么操作
//            HMEmoticonManager.recentEmoticon.append(emo)
            
            HMEmoticonManager.addRecent(emo)
            
            // 发送一个通知就可以了!!!
            NSNotificationCenter.defaultCenter().postNotificationName("emoticon", object: nil, userInfo: ["emoticon": emo])
        }
        
    }
    
    @objc private func deleteButtonClick(button: UIButton){
        
        
    }
    //第三步: 懒加载控件
    //MARK:-- 懒加载控件
    lazy var label: UILabel = UILabel()
    
    private lazy var deleteButton: UIButton = {
    
        let button = UIButton(type: UIButtonType.Custom)
        
        button.setImage(UIImage(named: "compose_emotion_delete"), forState: UIControlState.Normal)
        
        button.setImage(UIImage(named: "compose_emotion_delete_highlighted"), forState: UIControlState.Highlighted)
        
        button.addTarget(self, action: "deleteButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
        
        return button
    }()
}

